home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / xcoral / xcoral.lha / xcoral-1.72 / main_text.c < prev    next >
C/C++ Source or Header  |  1993-01-25  |  14KB  |  652 lines

  1. /*
  2. ** Copyright 1989, 1992 by Lionel Fournigault
  3. **
  4. ** Permission to use, copy, and distribute for non-commercial purposes,
  5. ** is hereby granted without fee, providing that the above copyright
  6. ** notice appear in all copies and that both the copyright notice and this
  7. ** permission notice appear in supporting documentation.
  8. ** The software may be modified for your own purposes, but modified versions
  9. ** may not be distributed.
  10. ** This software is provided "as is" without any expressed or implied warranty.
  11. **
  12. **
  13. */
  14.  
  15. #include <stdio.h>
  16. #include <X11/Xlib.h>
  17. #include <X11/Xutil.h>
  18. #include <sys/types.h>
  19. #include <sys/time.h>
  20. #include <string.h>
  21. #ifndef apollo
  22. #include <malloc.h>
  23. #endif
  24. #include "text.h"
  25. #include "browser.h"
  26.  
  27. static TextResources    tr;
  28. extern char *getenv ();
  29. extern void Display3D ();
  30.  
  31. /*
  32. **    Function name : InitTextRes
  33. **
  34. **    Description : Initialisations de resources communes
  35. **        aux fenetres de texte : la fonte et les couleurs.
  36. **
  37. **    Input : Le display, la fonte, les couleur du devant, du fond,
  38. **        du top_shadow et du buttom_shadow.
  39. **    Ouput :
  40. */
  41. void InitTextRes ( display, font, fg, bg, ts, bs )
  42.     Display        *display;
  43.     XFontStruct    *font;
  44.     unsigned long     fg, bg, ts, bs;
  45. {
  46.     XGCValues    gcv;
  47.     GC        gc;
  48.     unsigned long     gcm;
  49.  
  50.     gc = DefaultGC ( display, DefaultScreen ( display ) );
  51.  
  52.     tr.top_sh = ts;
  53.     tr.bot_sh = bs;
  54.     tr.cgc = XCreateGC ( display,     DefaultRootWindow ( display ), 0, &gcv );
  55.     tr.igc = XCreateGC ( display,    DefaultRootWindow ( display ), 0, &gcv );
  56.     tr.font = font;
  57.     tr.fg = fg;
  58.     tr.bg = bg;
  59.             
  60.     XCopyGC ( display, gc, (~0), tr.cgc );
  61.     XCopyGC ( display, gc, (~0), tr.igc );
  62.     
  63.     gcm = 0;
  64.     gcm |= GCForeground;    gcv.foreground = fg;
  65.     gcm |= GCBackground;    gcv.background = bg;
  66.     gcm |= GCFont;        gcv.font = font -> fid;
  67.  
  68.     XChangeGC ( display, tr.cgc, gcm, &gcv );
  69.     
  70.     gcm = 0;
  71.     gcm |= GCFunction;    gcv.function = GXxor;
  72.     gcm |= GCPlaneMask;    gcv.plane_mask = fg ^ bg;
  73.     gcm |= GCForeground;    gcv.foreground = fg ^ bg;
  74.     gcm |= GCBackground;    gcv.background = bg;
  75.  
  76.     XChangeGC ( display, tr.igc, gcm, &gcv );
  77. }
  78.  
  79.  
  80. /*
  81. **    Function name : MakeTextWindow
  82. **
  83. **    Description : Creation d'un fenetre de texte.
  84. **        
  85. **    Input : Le display, la fenetre parent, la position par rapport
  86. **        a celle-ci.
  87. **    Ouput : La structure Text.
  88. */
  89. Text *MakeTextWindow ( display, parent, x, y )
  90.     Display    *display;
  91.     Window    parent;
  92.     register int x, y;
  93. {
  94.     Text        *text;
  95.     XGCValues    gcv;
  96.     register char*    indent;
  97.     register int     tw;
  98.  
  99.     text = ( Text * ) malloc ( sizeof ( Text ));
  100.  
  101.     text -> width_relief = W_RELIEF;
  102.     text -> w_parent = parent;
  103.  
  104.     if ( DefaultDepth ( display, DefaultScreen ( display )) == 1 ) 
  105.         text -> width_relief = 1;           
  106.     
  107.     text -> window = XCreateSimpleWindow (display, parent, x,
  108.         y, DEFAULT_SIZE, DEFAULT_SIZE, 0, tr.fg, tr.bg );
  109.  
  110.     XSelectInput ( display, text -> window,
  111.         ExposureMask | KeyPressMask | VisibilityChangeMask |
  112.               KeyReleaseMask | ButtonPress | ButtonRelease );
  113.  
  114.     text -> Cgc = XCreateGC ( display, DefaultRootWindow ( display ), 0, &gcv );
  115.     XCopyGC ( display, tr.cgc, (~0), text -> Cgc );
  116.  
  117.     text -> Igc = tr.igc;
  118.     text -> top_sh = tr.top_sh;
  119.     text -> bot_sh = tr.bot_sh;
  120.     text -> lines_in_buf = 1;
  121.     text -> no_current_line = 1;
  122.     text -> n1 = 0;
  123.  
  124.     text -> fg = tr.fg;
  125.     text -> bg = tr.bg;
  126.  
  127.     text -> x_or = text -> y_or = MARGE;
  128.     text -> x_pos = text -> y_pos = MARGE;
  129.     text -> visible = 0;
  130.  
  131.     SetFontText ( display, text, tr.font );
  132.  
  133.     text -> cursor_stat = OFF;
  134.     text -> cursor_width = text -> char_width_ave;
  135.     text -> cursor_height = text -> font_height;
  136.     text -> sl = 0;
  137.     *text -> filename = 0;
  138.        text -> stat = 0;
  139.     text -> modif = False;
  140.     text -> mouse_in = False;
  141.     
  142.     text -> mode = default_mode;
  143.  
  144.     indent = (char *) getenv ( "XCORAL_INDENT_WIDTH" );
  145.     (void) strcpy ( text -> indent, "       " ); /* 8 blancs */
  146.     if ( indent == 0 )
  147.         text -> indent [3] = 0;
  148.     else {
  149.         tw = atoi (indent);
  150.         if ( tw == -1 )
  151.             strcpy(text->indent,"\t");
  152.         else if ( tw <= 0 || tw > 7 )
  153.             text -> indent [3] = 0;
  154.         else
  155.             text -> indent [tw] = 0;
  156.     }
  157.  
  158.     indent = (char *) getenv ( "XCORAL_TAB_WIDTH" );
  159.     if ( indent == 0 ) 
  160.         text -> tab_width = TAB_WIDTH;
  161.     else {
  162.         tw = atoi (indent); 
  163.         text -> tab_width = ( tw <= 0 || tw > 7 ) ? TAB_WIDTH : tw; 
  164.     }
  165.     
  166.     (void) bzero ( (char *) text -> page.wline, 256 );
  167.     (void) bzero ( (char *) text -> page.sline, 256 );
  168.  
  169.     text -> markline = text -> markpos = 0;
  170.     return text;
  171. }
  172.  
  173.  
  174. /*
  175. **    Function name : DeleteText
  176. **
  177. **    Description : Destruction d'une fenetre de texte.
  178. **
  179. **    Input : Le Display , la structure text.
  180. **    Ouput :
  181. */
  182. void DeleteText ( display, text )
  183.     Display *display;
  184.     Text *text;
  185. {
  186.     XFreeGC ( display, text -> Cgc );
  187.     XDestroyWindow ( display, text -> window );
  188.        if ( text != 0 ) 
  189.         (void) free ( (char *) text );
  190. }
  191.  
  192.  
  193. /*
  194. **    Function name : SetTextVisibility
  195. **
  196. **    Description : Positionne l'etat de visibilite.
  197. **
  198. **    Input : Le text courant, l'etat.
  199. **    Ouput :
  200. */
  201. int SetTextVisibility ( w, text, state )
  202.     Window w;
  203.     Text *text;
  204.     register int state;
  205. {
  206.        if ( w != text -> window )
  207.            return False;
  208. #ifdef DEBUG
  209.     fprintf ( stderr, "Text  window stat = %d\n", state ); 
  210. #endif
  211.     text -> visible = state;
  212.     return True;
  213. }
  214.  
  215.  
  216. /*
  217. **    Function name : GetVisibility
  218. **
  219. **    Description : Retourne l'etat de la visibilite.
  220. **
  221. **    Input : Le Display, le text courant.
  222. **    Ouput : Vrai ou Faux
  223. */
  224. int GetVisibility ( display, text )
  225.     Display *display;
  226.     Text *text;
  227. {
  228.         if ( text -> visible != VisibilityUnobscured ) {
  229.         XRaiseWindow ( display, text -> w_parent );
  230.         return False;
  231.     }
  232.     return True;
  233. }
  234.  
  235.  
  236. /*
  237. **    Function name : KillText
  238. **
  239. **    Description : Vire le texte d'une fenetre texte et met
  240. **        a jours les infos.
  241. **
  242. **    Input : Le display, le text courant.
  243. **    Ouput :
  244. */
  245. void KillText ( display, text )
  246.     Display *display;
  247.     Text *text;
  248. {
  249.     /*
  250.      * Affiche la premiere page pour positionner 
  251.      * certaines variables.
  252.      * Reset le buffer
  253.      */
  254.        FirstPage ( text );
  255.     ClearBuffer ( text -> buf );
  256.  
  257.     /* 
  258.      * Mis a jour des infos.
  259.      */
  260.     text -> lines_in_buf = 1; 
  261.        text -> modif = False;
  262.        text -> no_current_line = 1;
  263.     (void) bzero ( (char *) text -> page.wline, 256 );
  264.     (void) bzero ( (char *) text -> page.sline, 256 );
  265.  
  266.     /* 
  267.      * On nettoie bien
  268.      */
  269.     SetScrollLine ( text -> swin, 1 );
  270.     XClearWindow ( display, text -> window );
  271.     Display3D ( display, text -> window, text -> top_sh, text ->bot_sh, 2, 1 ); 
  272. }
  273.  
  274.  
  275. /*
  276. **    Function name : TextInBuf
  277. **
  278. **    Description : Comme son nom l'indique
  279. **    Input : Le text courant
  280. **    Ouput : Vrai ou faux
  281. */
  282. int TextInBuf ( text )
  283.     Text *text;
  284. {
  285.     if ( (! strcmp ( text -> filename, "NoName" )) && (text -> modif == False)) 
  286.         return False;
  287.     else 
  288.         return True;
  289. }
  290.  
  291.  
  292. /*
  293. **    Function name : SetFontText
  294. **
  295. **    Description : Positionne la fonte pour le texte courant.
  296. **
  297. **    Input :  Le display, le text courant, la fonte.
  298. **    Ouput :
  299. */
  300. void SetFontText ( display, text, font )
  301.     Display *display;
  302.     Text *text;
  303.     XFontStruct *font;
  304. {
  305.     text -> font = font;
  306.     text -> font_height = (font -> max_bounds.ascent) + (font ->max_bounds.descent);
  307.     text -> cursor_height = text -> font_height;
  308.  
  309.     text -> cursor_width = ( font -> min_bounds.width + font -> max_bounds.width ) / 2;
  310.     text -> char_width_ave = ( font -> min_bounds.width + font -> max_bounds.width ) / 2;
  311.  
  312.     XSetFont ( display, text -> Cgc, font -> fid );
  313. }
  314.  
  315.  
  316. /*
  317. **    Function name : LoadFont
  318. **
  319. **    Description : Comme son nom l'indique.
  320. **
  321. **    Input : Le display, le nom de la fonte
  322. **    Ouput : la structure
  323. */
  324. XFontStruct *LoadFont ( dpy, str )
  325.     Display *dpy;
  326.     char    *str;
  327. {
  328.     XFontStruct     *font;
  329.     extern void exit ();
  330.  
  331.        if ((font = XLoadQueryFont ( dpy, str )) == 0 ) {
  332.         (void) fprintf ( stderr, "Fontname error : %s\n", str );
  333.         if (( font = XLoadQueryFont ( dpy, "fixed" )) == 0 ) {
  334.             (void) fprintf ( stderr, "Can't load font : fixed\n" );
  335.             (void) exit (1);
  336.         }
  337.         ( void ) fprintf ( stderr, "Use font : fixed\n" );
  338.         }
  339.         return font;
  340. }
  341.  
  342.  
  343. /*
  344. **    Function name : ChangeTextFont
  345. **
  346. **    Description : Change la fonte courante.
  347. **
  348. **    Input : Le display, le text courant, le nom de la nouvelle fonte.
  349. **    Ouput :
  350. */
  351. void ChangeTextFont ( dpy, text, f )
  352.     Display *dpy;
  353.     Text *text;
  354.     register char *f;
  355. {
  356.     XFontStruct *font;
  357.     register int i;
  358.  
  359.     TextCursorOff ( text );
  360.     font = LoadFont ( dpy, f );
  361.     i = GetLineInPage ( text, font );
  362.  
  363.     SetFontText ( dpy, text, font );
  364.  
  365.     SetScrollFont ( text -> swin, font );
  366.     SetScrollLinePage ( text -> swin, i ); 
  367.     SetLineInPage ( text, i );
  368.     SetScrollBarSize ( dpy, text -> swin );
  369.  
  370.     ClearPage ( text );
  371.     text -> n1 = 0;
  372.     text -> n2 = text -> lines_in_page - 1;
  373.        
  374.     SetLinesTable ( text );
  375.     ClipOn ( text, 0 );
  376.     RefreshPage ( text );
  377.     ClipOff ( text );
  378.  
  379. #ifdef DEBUG
  380.        fprintf ( stderr, "no_current = %d\n", text -> no_current_line );
  381. #endif
  382.        
  383.     (void) MoveScrollBar ( dpy,  text -> swin, CURRENT, text -> no_current_line - 1 );
  384.     TextCursorOn ( text );
  385. }
  386.  
  387.  
  388. /*
  389. **    Function name : GetLineInPage
  390. **
  391. **    Description : Retourne le nombre de lignes dans la page
  392. **        courante pour une fonte donnee
  393. **
  394. **    Input : Le text courant, la fonte.
  395. **    Ouput : le nombre de lignes.
  396. */
  397. int GetLineInPage ( text, font )
  398.     Text *text;
  399.     XFontStruct *font;
  400. {
  401.     return ( (text -> height - (2*MARGE)) / 
  402.         (font -> max_bounds.ascent + font -> max_bounds.descent));
  403. }
  404.  
  405.  
  406. /*
  407. **    Function name : MouseIn
  408. **
  409. **    Description : La pointeur est dans le text courant.
  410. **
  411. **    Input : le text courant
  412. **    Ouput :
  413. */
  414. void MouseIn ( text )
  415.     Text *text;
  416. {
  417. #ifdef DEBUG
  418.     (void) fprintf ( stderr, "Mouse in\n" );
  419. #endif
  420.     text -> mouse_in = True;
  421. }
  422.  
  423.  
  424. /*
  425. **    Function name : MouseOut
  426. **
  427. **    Description : Le pointeur n'est plus dans le text courant
  428. **
  429. **    Input : Le text courant.
  430. **    Ouput :
  431. */
  432. void MouseOut ( text )
  433.     Text *text;
  434. {
  435. #ifdef DEBUG
  436.     (void) fprintf ( stderr, "Mouse out\n" );
  437. #endif
  438.     text -> mouse_in = False;
  439. }
  440.  
  441.  
  442. /*
  443. **    Function name : ShowWindowText
  444. **
  445. **    Description : Affichage de la fenetre de texte.
  446. **
  447. **    Input : Le display, le text courant, la geometrie.
  448. **    Ouput :
  449. */
  450. void ShowWindowText ( display, text,width, height )
  451.     Display    *display;
  452.     Text    *text;
  453.     int    width, height;
  454. {
  455.     register int x;
  456. #ifdef DEBUG
  457.     (void) fprintf ( stderr, "ShowWindowText width = %d height = %d\n",
  458.          width, height );
  459. #endif
  460.     x = height - ( 2 * MARGE );
  461.     text -> lines_in_page = (x / text -> font_height);
  462.     text -> n2 = ( text -> lines_in_page - 1 ) - text -> n1;
  463.     text -> width = width;
  464.     text -> height = height;
  465.  
  466. #ifdef DEBUG
  467.     (void) fprintf ( stderr, "ShowWindowText text-height = %d\n",
  468.          text -> height );
  469.     (void) fprintf ( stderr, "lineinpage = %d\n", text -> lines_in_page );
  470. #endif
  471.     XResizeWindow ( display, text -> window, text -> width, text -> height );
  472.     XMapWindow ( display, text -> window );
  473. }
  474.  
  475.  
  476. /*
  477. **    Function name : SetTextSave
  478. **
  479. **    Description : Mise a jour des infos apres une sauvegarde
  480. **        du buffer courant,
  481. **    Input : Le text
  482. **    Ouput :
  483. */
  484. SetTextSave ( text )
  485.     Text *text;
  486. {
  487.     text -> modif = False;
  488.           text -> mwin -> stat = False;
  489.     RefreshWindowStatBuf ( text -> mwin );
  490. }
  491.  
  492.  
  493. /*
  494. **    Function name : SetTextModif
  495. **
  496. **    Description : Mise a jour des infos apres une modification
  497. **        du buffer courant.
  498. **    Input : Le text
  499. **    Ouput :
  500. */
  501. SetTextModif ( text) 
  502.     Text *text;
  503. {
  504.     text -> modif = True;
  505.              text -> mwin -> stat = True;
  506.     RefreshWindowStatBuf ( text -> mwin );
  507. }
  508.  
  509.  
  510. /*
  511. **    Function name : SetTextMode
  512. **
  513. **    Description :
  514. **    Input : 
  515. **    Ouput :
  516. */
  517. void SetTextMode ( text )
  518.     Text *text;
  519. {
  520.     text -> mode = TEXT; 
  521.        text -> mwin -> mode = TEXT;
  522.     SetBrowserMode ( TEXT );
  523. /*    RefreshBrowserControl (); */
  524.     UnmapBrowser ();
  525.     RefreshWindowMode ( text -> mwin );
  526. }
  527.  
  528.  
  529. /*
  530. **    Function name : SetCMode
  531. **
  532. **    Description : 
  533. **    Input : 
  534. **    Ouput :
  535. */
  536. void SetCMode ( text )
  537.     Text *text;
  538. {
  539.     text -> mode = STD_C;
  540.     text -> mwin -> mode = STD_C;   
  541.     SetBrowserMode ( STD_C );
  542.        RefreshBrowserControl ();
  543.     RefreshWindowMode ( text -> mwin );
  544. }
  545.  
  546.  
  547. /*
  548. **    Function name : SetCCMode
  549. **
  550. **    Description : 
  551. **    Input : 
  552. **    Ouput :
  553. */
  554. void SetCCMode ( text )
  555.     Text *text; 
  556. {
  557.     text -> mode = CPLUS;
  558.     text -> mwin -> mode = CPLUS;
  559.     SetBrowserMode ( CPLUS );
  560.        RefreshBrowserControl ();
  561.     RefreshWindowMode ( text -> mwin );
  562. }
  563.  
  564.  
  565. /*
  566. **    Function name : ChangeDir
  567. **
  568. **    Description : Change de directorie courante.
  569. **    Input : Le text courant.
  570. **    Ouput :
  571. */
  572. void ChangeDir ( text )
  573.     Text *text;
  574. {
  575.     register char *tmp;
  576.        char buf [128];
  577.     register int len;
  578.    
  579.     (void) chdir ( text -> current_dir );
  580.        
  581.        /* 
  582.         * Affichage du filename ou de la directorie.
  583.         */
  584.     if ( text -> filename == 0 )
  585.         return;
  586.        len = strlen ( text -> filename );
  587.     if ( strcmp ( text -> filename + ( len - strlen ( "NoName" )), "NoName" ) == 0 ) {
  588.               len = strlen ( text -> current_dir );
  589.         if ( len > 20 ) {
  590.             (void) sprintf ( buf, "Dir : ...%s\n", 
  591.                 (char *) text -> current_dir + ( len - 20) );
  592.         }
  593.         else
  594.             (void) sprintf ( buf, "Dir : %s\n", text -> current_dir );
  595.         DisplayMessage ( text -> mwin, buf  );
  596.         return;
  597.     }
  598.     tmp = strrchr ( text -> filename, '/' );
  599.     if ( tmp != 0 )
  600.         DisplayMessage ( text -> mwin, tmp + 1 );
  601. }
  602.  
  603.  
  604. /*
  605. **    Function name : ExposeTextWindow
  606. **
  607. **    Description : Traitement d'un expose event dans une 
  608. **        fenetre de texte.
  609. **    Input : Le display, le text courant, la fenetre exposee.
  610. **    Ouput :
  611. */
  612. void ExposeTextWindow ( dpy, text, ev )
  613.     Display *dpy;
  614.     Text *text;
  615.     XEvent *ev;
  616. {
  617.     XRectangle rec [2];
  618.        Region region;
  619.        XEvent tmp;
  620.  
  621.     Display3D ( dpy, text -> window,
  622.         text -> top_sh,
  623.         text -> bot_sh,
  624.         text -> width_relief, DOWN );
  625.  
  626.     region = XCreateRegion ();
  627.  
  628.     rec [0].x = ((XExposeEvent *) ev) -> x;
  629.     rec [0].y = ((XExposeEvent *) ev) -> y;
  630.     rec [0].width = ((XExposeEvent *) ev) -> width;
  631.     rec [0].height = ((XExposeEvent *) ev) -> height;
  632.  
  633.     XUnionRectWithRegion ( rec, region, region );
  634.     while ( XCheckTypedWindowEvent ( dpy, text -> window, Expose, &tmp )) {
  635.         rec [0].x = tmp.xexpose.x;
  636.         rec [0].y = tmp.xexpose.y;
  637.         rec [0].width = tmp.xexpose.width;
  638.         rec [0].height = tmp.xexpose.height;
  639.         XUnionRectWithRegion ( rec, region, region );
  640.     }
  641.     XSetRegion ( dpy, text -> Cgc, region );
  642.     ExposePage ( region, text );
  643.     XSetClipMask ( dpy, text -> Cgc, None );
  644.     XDestroyRegion ( region );
  645.     SetCurrentLine ( text );
  646.     if ( text -> mouse_in == True ) 
  647.         TextCursorOn ( text );
  648.     else
  649.            FreeseTextCursor ( text ); 
  650.     return;
  651. }
  652.